package com.ang.controller;

import com.alibaba.fastjson.JSON;
import com.ang.base.WeChatAccessToken;
import com.ang.base.WeChatUserInfo;
import com.ang.domain.ParamObject;
import com.ang.service.WeChatLoginService;
import com.ang.utils.MySerializable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author ssang
 * @date 2022-01-12 15:59
 */
@Controller
@RequestMapping("/wechat")
public class ThirdLoginWeChatController {
    @Autowired
    WeChatLoginService weChatLoginService;

    /**
     * 点击第三方登录，使用微信登录
     * 跳转到微信扫码页面
     */
    @GetMapping("/toLogin")
    @ResponseBody
    public String login() throws IOException {
        //获取跳转的扫码地址
        String redirectUrl = weChatLoginService.getWeixinQRUrl();

        return redirectUrl;
    }

    /**
     * 回调函数，用户扫码同意后，跳转到该接口，并携带code和state
     * 1.获取code和state
     * 2.通过code获取token
     * 3.再根据token获取微信端的用户信息
     */
    @RequestMapping("/getWeChatUserInfo")
    public String getWeChatUserInfo(String code, String state) throws IOException, ClassNotFoundException {

        System.out.println("===================code:"+code);
        System.out.println("===================state:"+state);

        //此处state是一个ParamObject对象，在构造回调参数的时候，使用state传递的参数
        ParamObject objFromStr = (ParamObject) MySerializable.getObjFromStr(state);
        System.out.println(objFromStr.getId());

        //从redis获取state信息，与回调接受的state对比，可用于防止csrf攻击（跨站请求伪造攻击）
//        String realState = redisService.getCacheObject(WeChatConstant.STATE_KEY);
//        if(!state.equals(realState)){
//            throw new ServiceException("微信回调地址，返回的state不一致");
//        }

        //请求token
        WeChatAccessToken token = weChatLoginService.getAccessTokenByCode(code);
        //根据token获取用户信息
        WeChatUserInfo userInfo = weChatLoginService.getWeixinUserInfo(token);

        System.out.println(JSON.toJSONString(userInfo));

        /**
         * 可以在此处，根据业务需求开发自己的功能
         * 如：关联本地账户，用来实现登录逻辑
         *      1.本地有账户，直接登录，返回token
         *      2.本地没有账户，需要跳转页面，用户注册后绑定微信
         */

//        return JSON.toJSONString(userInfo);
        return "redirect:http://www.baidu.com";
    }

    /**
     * 登录，并绑定微信账号
     * @param sysWechatUser
     * @return
     */
    /*
    @PostMapping("/loginAndBindWechatAccount")
    @ResponseBody
    public R<?> loginAndBindWechatAccount(@RequestBody SysWechatUser sysWechatUser)
    {
        // 用户登录
        LoginUser userInfo = sysLoginService.login(sysWechatUser.getUsername(), sysWechatUser.getPassword());

        //获取本地账号信息
        sysWechatUser.setSystemUserName(userInfo.getSysUser().getUserName());
        sysWechatUser.setSystemUserId(userInfo.getSysUser().getUserId());
        sysWechatUser.setDelFlag("0");
        //关联本地账号和微信openID
        remoteSysWechatUserService.bindWeChatAccount(sysWechatUser);

        // 获取登录token
        return R.ok(tokenService.createToken(userInfo));
    }
    */

}
